#include <stdlib.h>
#include "NodoInterno.h"
#include "../../Fisica/ArchivoBloques.h"
#include "Nodo.h"
#include "NodoHoja.h"
#ifndef ARBOLBMAS_H_
#define ARBOLBMAS_H_

class ArbolBMas {
public:
        ArbolBMas(string path,string tipo); //CTOR
        virtual ~ArbolBMas();

        int Agregar(Clave clave, unsigned int id);
        int Borrar(Clave clave, unsigned int id);
        list<unsigned int>* buscarClave (Clave clave);

        void mostrarRaiz();
        void mostrarArbol();
        void mostrarArbolRecursivo(Nodo* nodo);

        void persistir();

        int partirNodoHoja(NodoInterno* nodo_padre, NodoHoja* nodo_hijo );
        int partirNodoInterno(NodoInterno* nodo_actual, NodoInterno* nodo_hijo);

        void partirNodoRaiz();
        void partirNodoRaizHoja();
        void partirNodoRaizInterno();

        int balancearNodoHoja(NodoInterno* nodo_padre, NodoHoja* nodo_hijo);
        int mergeNodoHojaDerecho(NodoInterno* nodo_padre, NodoHoja* nodo_izquierdo, NodoHoja* nodo_derecho);
        int equilibrarNodoHojaDerecho(NodoInterno* nodo_padre,NodoHoja* nodo_izq, NodoHoja* nodo_der);
        int mergeNodoHojaIzquierdo(NodoInterno* nodo_padre,NodoHoja* nodo_der,NodoHoja* nodo_izq);
        int equilibrarNodoHojaIzquierdo(NodoInterno* nodo_padre,NodoHoja* nodo_der,NodoHoja* nodo_izq);

        int balancearNodoInterno(NodoInterno*nodo_actual,NodoInterno* nuevo_nodo_actual);
        int mergeNodoInternoDerecho(NodoInterno* nodo_padre, NodoInterno* nodo_izquierdo, NodoInterno* nodo_derecho);
        int equilibrarNodoInternoDerecho(NodoInterno* nodo_padre, NodoInterno* nodo_izquierdo, NodoInterno*nodo_derecho);
        int mergeNodoInternoIzquierdo(NodoInterno* nodo_padre, NodoInterno* nodo_izquierdo, NodoInterno* nodo_derecho);
        int equilibrarNodoInternoIzquierdo(NodoInterno* nodo_padre, NodoInterno* nodo_izquierdo, NodoInterno* nodo_derecho);


        list<unsigned int>* buscarEnLaRaizHoja(Clave clave);
        list<unsigned int>* buscarClaveRecursivo(Clave clave, Nodo* nodo_actual);
        int agregarRecursivo (Nodo * nodo_actual, Clave cancion, unsigned int id);
        int eliminarRecursivo (Nodo * nodo_actual, Clave cancion, unsigned int id);
        void balancearADerecha(NodoHoja * nodoizq, NodoHoja* nododer, NodoInterno * nodopadre);

private:
        Nodo * raiz;
        ArchivoBloques * archivo;
};

#endif /* ARBOLBMAS_H_ */
